第 2 章 APP 使用说明 ================================ 1、APP概述 ############ | 本章旨在介绍常见的蓝牙应用方案,从最接近目标产品的APP开始,指导用户开发。AC63N_BT_SDK系列集成了蓝牙应用App,具有丰富的板级配置、外设驱动以及蓝牙数据库等,并将持续集成更多通用蓝牙方案。 2、APP-Bluetooth Dual-Mode SPP-BLE ########################################## 2.1 概述 <<<<<<<<< | 支持蓝牙双模透传传输功能。CLASSIC蓝牙使用标准串口SPP profile协议,BLE蓝牙使用自定义的profile协议,提供ATT的WRITE、WRITE_WITHOUT_RESPONSE,NOTIFY和INDICATE等属性传输收发数据。 2.2 工程配置 <<<<<<<<< 代码工程 ``apps\spp_and_le\board\bd19\AC632N_spp_and_le.cbp`` 。 1)先配置板级 ``board_config.h`` 和对应配置文件中蓝牙双模使能。 .. code-block:: c /* *  板级配置选择 */ #define CONFIG_BOARD_AC632N_DEMO // #define CONFIG_BOARD_AC6321A_DEMO #include "board_ac632n_demo_cfg.h" #include "board_ac6321a_demo_cfg.h" 在 ``board_ac632n_demo_cfg.h`` 中配置打开 edr 和 ble 模块。 .. code-block:: c #define TCFG_USER_BLE_ENABLE                      1   //BLE功能使能 #define TCFG_USER_EDR_ENABLE                      1   //EDR功能使能 2)配置对应case需求: ``app_config.h`` 。 .. code-block:: c //apps example 选择,只能选1个,要配置对应的board_config.h #define CONFIG_APP_SPP_LE                 1 //SPP + LE or LE's client #define CONFIG_APP_MULTI                  0 //蓝牙LE多连 + spp #define CONFIG_APP_DONGLE                0 //usb + 蓝牙(ble 主机),PC hid设备 #define CONFIG_APP_CENTRAL               0 //ble client,中心设备 #define CONFIG_APP_LL_SYNC               0 //腾讯连连 #define CONFIG_APP_BEACON                0 //蓝牙BLE ibeacon #define CONFIG_APP_NONCONN_24G           0 //2.4G 非连接收发 #define CONFIG_APP_TUYA                  0 //涂鸦协议 #define CONFIG_APP_AT_COM                0 //AT com HEX格式命令 #define CONFIG_APP_AT_CHAR_COM           0 //AT com 字符串格式命令 #define CONFIG_APP_IDLE                  0 //空闲任务 3)配置对应case需求:``app_config.h`` 。 .. code-block:: c #if CONFIG_APP_SPP_LE //配置双模同名字,同地址 #define DOUBLE_BT_SAME_NAME                0 //同名字 #define DOUBLE_BT_SAME_MAC                 0 //同地址 #define CONFIG_APP_SPP_LE_TO_IDLE          0 //SPP_AND_LE To IDLE Use 4)蓝牙的BLE配置,保护GATT和SM的配置。 .. code-block:: c //蓝牙BLE配置 #define CONFIG_BT_GATT_COMMON_ENABLE       1 //配置使用gatt公共模块 #define CONFIG_BT_SM_SUPPORT_ENABLE        0 //配置是否支持加密 #define CONFIG_BT_GATT_CLIENT_NUM          0 //配置主机client个数 (app not support) #define CONFIG_BT_GATT_SERVER_NUM          1 //配置从机server个数 #define CONFIG_BT_GATT_CONNECTION_NUM      (CONFIG_BT_GATT_SERVER_NUM + CONFIG_BT_GATT_CLIENT_NUM) //配置连接个数 2.3 SPP数据通信 <<<<<<<<<<<<<<<< 推荐使用手机测试工具:“SPP蓝牙串口”。 SPP数据通信的代码文件为 ``spp_trans.c`` 。 2.3.1接口说明: ``spp_trans.c`` <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 1)SPP模块初始化。 .. code-block:: c void transport_spp_init(void) {     log_info("trans_spp_init\n");     log_info("spp_file: %s", __FILE__); #if (USER_SUPPORT_PROFILE_SPP==1)   spp_state = 0;     spp_get_operation_table(&spp_api);    spp_api->regist_recieve_cbk(0, transport_spp_recieve_cbk);     spp_api->regist_state_cbk(0, transport_spp_state_cbk);     spp_api->regist_wakeup_send(NULL, transport_spp_send_wakeup); #endif #if TEST_SPP_DATA_RATE     spp_timer_handle  = sys_timer_add(NULL, test_timer_handler, SPP_TIMER_MS); #endif } 2)SPP连接和断开事件处理。 .. code-block:: c static void transport_spp_state_cbk(u8 state) { spp_state = state; switch (state) { case SPP_USER_ST_CONNECT: log_info("SPP_USER_ST_CONNECT ~~~\n"); break; case SPP_USER_ST_DISCONN: log_info("SPP_USER_ST_DISCONN ~~~\n"); spp_channel = 0; break; default: break; } } 3)SPP发送数据接口,发送前先调用接口transport_spp_send_data_check检查。 .. code-block:: c int transport_spp_send_data(u8 *data, u16 len) { if (spp_api)  { log_info("spp_api_tx(%d) \n", len); /* log_info_hexdump(data, len); */ /* clear_sniff_cnt(); */ bt_comm_edr_sniff_clean(); return spp_api->send_data(NULL, data, len); } return SPP_USER_ERR_SEND_FAIL; } 4)SPP检查是否可以往协议栈发送数据。 .. code-block:: c int transport_spp_send_data_check(u16 len) { if (spp_api) { if (spp_api->busy_state()) { return 0; } } return 1; } 5)SPP发送完成回调,表示可以继续往协议栈发数,用来触发继续发数。 .. code-block:: c static void transport_spp_send_wakeup(void) { putchar('W'); } 6)SPP接收数据接口。 .. code-block:: c static void transport_spp_recieve_cbk(void *priv, u8 *buf, u16 len) { spp_channel = (u16)priv; log_info("spp_api_rx(%d) \n", len); log_info_hexdump(buf, len); } 2.3.2 收发测试: ``spp_trans.c`` <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 代码已经实现收到手机的SPP数据后,会主动把数据回送,测试数据收发。 .. code-block:: c //loop send data for test if (transport_spp_send_data_check(len))   { log_info("-loop send\n"); transport_spp_send_data(buf, len); } 3、APP-Bluetooth Dual-Mode AT Moudle ####################################### 概述 <<<<<<<<< | 主要功能是在普通数传BLE和EDR的基础上增加了由上位机或其他MCU可以通过UART对接蓝牙芯片进行基本配置、状态获取、控制扫描、连接断开以及数据收发等操作。 | AT控制透传支持从机模式和主机模式, 编译的时候只能二选一, 从机模式支持双模, 主机模式只支持BLE。 | 定义一套串口的控制协议,具体请查看附录A 《蓝牙AT协议》。 工程配置 <<<<<<<<< | 代码工程: ``apps\spp_and_le\board\bd29\AC631N_spp_and_le.cbp`` 。 配置描述 <<<<<<<<< 1)先配置板级 ``board_config.h`` 和对应配置文件中蓝牙双模使能。 .. code-block:: c /*   *  板级配置选择   */   #define CONFIG_BOARD_AC630X_DEMO   // #define CONFIG_BOARD_AC6311_DEMO   // #define CONFIG_BOARD_AC6313_DEMO   // #define CONFIG_BOARD_AC6318_DEMO   // #define CONFIG_BOARD_AC6319_DEMO 2)配置对应的 ``board_acxxx_demo_cfg.h`` 文件使能BLE或EDR(主机不支持EDR), 以 ``board_ac630x_demo_cfg.h`` 为例。 .. code-block:: c #define TCFG_USER_BLE_ENABLE                      1   //BLE功能使能   #define TCFG_USER_EDR_ENABLE                      1   //EDR功能使能 4、APP-Bluetooth Dual-Mode Central ######################################### 概述 <<<<<<< | Central中心设备是使用GATT的client角色,在SDK中是以主机Master的方式实现,主动发起搜索和连接其他BLE设备。连接成功后遍历从机GATT的Services信息数据。最大支持16个Sevices遍历。 | SDK的例子是以杰理的数传SDK的BLE的设备中Services为搜索目标,用户根据需求也可自行搜索过滤其他的Services。 工程配置 <<<<<<<<<<<< 代码工程:``apps\spp_and_le\board\bd19\AC632N_spp_and_le.cbp`` 1)先配置板级board_config.h和对应配置文件中蓝牙双模使能。 .. code-block:: c /*   *  板级配置选择  */   #define CONFIG_BOARD_AC632X_DEMO   // #define CONFIG_BOARD_AC6311_DEMO     #include "board_ac632x_demo_cfg.h"   #include "board_ac6321a_demo_cfg.h"   配置只支持ble模块,如下代码: .. code-block:: c #define TCFG_USER_BLE_ENABLE                    1   //BLE功能使能   #define TCFG_USER_EDR_ENABLE                      0  //EDR功能使能 5、APP-Bluetooth Dual-Mode Dongle ################################## 概述 <<<<<<<<< | 蓝牙dongle符合USB和BLE或EDR传输标准,具有即插即用,方便实用的特点。它可用于蓝牙设备之间的数据传输,让电脑能够和周边的蓝牙设备进行无线连接和数据的通讯,自动发现和管理远程蓝牙设备、资源和服务,实现蓝牙设备之间的绑定和自动连接。 | 蓝牙dongle支持BLE和2.4G两种连接模式;支持连接指定蓝牙名或mac地址;应用示例是连接杰理的鼠标。 | 蓝牙dongle支持EDR,支持连接指定蓝牙名或mac地址,连接杰理的键盘设备。 | 蓝牙双模dongle不建议同时打开,会降低搜索效率。 工程配置 <<<<<<<<< | 代码工程: ``apps\spp_and_le\board\bd19\AC632N_spp_and_le.cbp`` 1)APP选择,配置app_config.h。 .. code-block:: c //app case 选择,只能选1个,要配置对应的board_config.h 2)使用EDR模式,还必先打印如下主机搜索使能。 .. code-block:: c #define EDR_EMITTER_EN 1 //蓝牙(edr主机) 3)板级选择, 配置board_config.h。目前只有AC6328a_DONGLE板子支持蓝牙dongle。 .. code-block:: c //#define CONFIG_BOARD_AC636N_DEMO #define CONFIG_BOARD_AC6368B_DONGLE //CONFIG_APP_DONGLE // #define CONFIG_BOARD_AC6363F_DEMO 主要代码说明 <<<<<<<<<<<<< 蓝牙dongle实现文件 app_dongle.c和ble_dg_central,负责模块初始化、处理协议栈事件和命令数据控制发送等。 1)HID描述符, 描述为一个鼠标。 .. code-block:: c static const u8 sHIDReportDesc[] = { 0x05, 0x01, // Usage Page (Generic Desktop Ctrls) 0x09, 0x02, // Usage (Mouse) 0xA1, 0x01, // Collection (Application) 0x85, 0x01, // Report ID (1) 0x09, 0x01, // Usage (Pointer) 2)使用指定的uuid与从机通信, 需要与从机配合, 省掉了搜索uuid的时间。 .. code-block:: c static const target_uuid_t dongle_search_ble_uuid_table[] = { { .services_uuid16 = 0x1812, .characteristic_uuid16 = 0x2a4d, .opt_type = ATT_PROPERTY_NOTIFY, }, { .services_uuid16 = 0x1812, .characteristic_uuid16 = 0x2a33, .opt_type = ATT_PROPERTY_NOTIFY, }, { .services_uuid16 = 0x1801, .characteristic_uuid16 = 0x2a05, .opt_type = ATT_PROPERTY_INDICATE, }, }; /*  确定留给从机发数据的3个notify handle  */   static const u16 mouse_notify_handle[3] = {0x0027, 0x002b, 0x002f}; 6、APP - Bluetooth DualMode Keyboard ####################################### 概述 <<<<<< 本案例为基于HID的键盘设备,可以用来媒体播放,上下曲暂停音量的控制,支持安卓和IOS的双系统,并且支持BLE和EDR两种工作模式。 工程配置 <<<<<<<<<< 代码工程:``apps\hid\board\br19\AC632N_hid.cbp`` 1)先进行APP选择配置(``apps\hid\include\app_config.h``)。 .. code-block:: c //app case 选择,只选1,要配置对应的board_config.h   #define CONFIG_APP_KEYBOARD               1//hid按键 ,default case   #define CONFIG_APP_KEYFOB              0//自拍器,board_ac6368a,board_6318   #define CONFIG_APP_MOUSE                  0//mouse,   board_mouse   #define CONFIG_APP_STANDARD_KEYBOARD         0//标准HID键盘,board_ac6351d   #define CONFIG_APP_KEYPAGE                 0//翻页器   2)配置板级board_config.h(`` apps\hid\board\bd19\board_config.h ``),下图为选择AC632n板级,也可以选择ac6321a板级。 .. code-block:: c /*   *  板级配置选择   */   #define CONFIG_BOARD_AC632N_DEMO     // CONFIG_APP_KEYBOARD,CONFIG_APP_PAGE_TURNER   // #define CONFIG_BOARD_AC6321_DEMO   // CONFIG_APP_KEYBOARD,CONFIG_APP_PAGE_TURNER   #include "board_ac6321a_demo_cfg.h"   #include "board_ac6323a_mouse_cfg.h"   #include "board_ac6328a_mouse_cfg.h"   #include "board_ac6329b_demo_cfg.h"   #include "board_ac6329c_demo_cfg.h"     #endif   7、APP - Bluetooth DualMode Keyfob ####################################### 概述 <<<<<< 本案例主要用于蓝牙自拍器实现,进行以下配置后,打开手机蓝牙连接设备可进行对应的拍照操作。由于自拍器的使用会用到LED所以本案例也要对LED进行对应的设置,自拍器设备上电以后没有连接蓝牙之前,LED以一定的频率闪烁,直到连接或者是进入sleep模式时熄灭。蓝牙连接以后LED熄灭,只有按键按下的时候LED会同时接通过,可以通过LED的状态来判断自拍器的工作状态。 工程配置 <<<<<<<<< 代码工程:``apps\hid\board\bd19\AC632N_hid.cbp`` 1)配置app选择(``apps\hid\include\app_config.h``),如下代码选择对应的自拍器应用。 .. code-block:: c //app case 选择,只选1,要配置对应的board_config.h   #define CONFIG_APP_KEYFOB        1//自拍器,  board_ac6328a,board_6328    2)先配置板级board_config.h(``apps\hid\board\bd19\board_config.h``),选择对应的开发板。 .. code-block:: c //#define CONFIG_BOARD_AC632N_DEMO       // CONFIG_APP_KEYBOARD,CONFIG_APP_PAGE_TURNER   // #define CONFIG_BOARD_AC6321A_MOUSE  // CONFIG_APP_MOUSE    #define CONFIG_BOARD_AC632X_DEMO     // CONFIG_APP_KEYFOB   #include "board_ac632n_demo_cfg.h"   #include "board_ac6321a_demo_cfg.h"   8、APP - Bluetooth DualMode KeyPage ####################################### 概述 <<<<<<< 本APP基于HID开发,主要用于浏览当下火爆的抖音等小视频的上下翻页、左右菜单切换、暂停等操作。首先选择需要用到的应用本案例选择,然后进行对应的支持板级选择,具体参考下文的步骤。通过软件编译下载到对应的开发板,打开手机蓝牙进行连接,进入视频浏览界面操作对应按键即可。 工程配置 <<<<<<<<<< 代码工程:``apps\hid\board\bd19\AC632N_hid.cbp``。